/* Redmine - project management software
 Copyright (C) 2006-2013  Jean-Philippe Lang */

function postUpMsg(attachmentId) {
    $.ajax({
        url: '/attachments/renderTag',
        type: "GET",
        data: {
            attachmentId: attachmentId
        }

    })
}
function addFile(inputEl, file, eagerUpload) {

    if ($('#attachments_fields').children().length < 10) {

        var attachmentId = addFile.nextAttachmentId++;

        var fileSpan = $('<span>', { 'id': 'attachments_' + attachmentId, 'class': 'attachment' });

        fileSpan.append(
            $('<input>', { 'type': 'text', 'class': 'filename readonly', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly'}).val(file.name),
            $('<input>', { 'type': 'text', 'class': 'description', 'name': 'attachments[' + attachmentId + '][description]', 'maxlength': 255, 'placeholder': $(inputEl).data('description-placeholder') }).toggle(!eagerUpload),
            $('<a>&nbsp</a>').attr({ 'href': "#", 'class': 'remove-upload', 'data-confirm': "您确定要删除吗？" }).click(removeFile).toggle(!eagerUpload),
            $('<div>', {  'class': 'div_attachments', 'name': 'div_' + 'attachments_' + attachmentId})
        ).appendTo('#attachments_fields');

        if (eagerUpload) {
            ajaxUpload(file, attachmentId, fileSpan, inputEl);

        }
        return attachmentId;
    }
    return null;
}

addFile.nextAttachmentId = 1;

function ajaxUpload(file, attachmentId, fileSpan, inputEl) {

    function onLoadstart(e) {
        fileSpan.removeClass('ajax-waiting');
        fileSpan.addClass('ajax-loading');
        $('input:submit', $(this).parents('form')).attr('disabled', 'disabled');
    }

    function onProgress(e) {
        if (e.lengthComputable) {
            this.progressbar('value', e.loaded * 100 / e.total);
        }
    }

    function actualUpload(file, attachmentId, fileSpan, inputEl) {

        ajaxUpload.uploading++;

        uploadBlob(file, $(inputEl).data('upload-path'), attachmentId, {
            loadstartEventHandler: onLoadstart.bind(progressSpan),
            progressEventHandler: onProgress.bind(progressSpan)
        })
            .done(function (result) {
                progressSpan.progressbar('value', 100).remove();
                fileSpan.find('input.description, a').css('display', 'inline-block');
            })
            .fail(function (result) {
                progressSpan.text(result.statusText);
            }).always(function () {
                ajaxUpload.uploading--;
                fileSpan.removeClass('ajax-loading');
                var form = fileSpan.parents('form');
                if (form.queue('upload').length == 0 && ajaxUpload.uploading == 0) {
                    $('input:submit', form).removeAttr('disabled');
                }
                form.dequeue('upload');
            });

        //gcm files count and add delete_all link

        var count = $('#attachments_fields>span').length;
        $('#upload_file_count').html("已上传" + "<span id=\"count\">" + count + "</span>" + "个文件");

        if (count >= 1) {
            var add_attachs = $('.add_attachment');
            var delete_all = $('.remove_all');
            if (delete_all.length < 1) {
                add_attachs.append($("<a>&nbsp</a>").attr({"href": "javascript:void(0)", 'class': 'remove_all', "onclick": "removeAll()"}));
            }
        }

        //gcm

    }

    var progressSpan = $('<div>').insertAfter(fileSpan.find('input.filename'));
    progressSpan.progressbar();
    fileSpan.addClass('ajax-waiting');

    var maxSyncUpload = $(inputEl).data('max-concurrent-uploads');

    if (maxSyncUpload == null || maxSyncUpload <= 0 || ajaxUpload.uploading < maxSyncUpload)
        actualUpload(file, attachmentId, fileSpan, inputEl);
    else
        $(inputEl).parents('form').queue('upload', actualUpload.bind(this, file, attachmentId, fileSpan, inputEl));
}

ajaxUpload.uploading = 0;

function removeFile() {
    $(this).parent('span').remove();
    return false;
}

//gcm delete all file
function removeAll() {
    if (confirm("您确定要删除所有文件吗?")) {
        $(".remove-upload").removeAttr("data-confirm");
        $(".remove-upload").click();
    }
//	return false;
}
//gcm

function uploadBlob(blob, uploadUrl, attachmentId, options) {

    var actualOptions = $.extend({
        loadstartEventHandler: $.noop,
        progressEventHandler: $.noop
    }, options);

    uploadUrl = uploadUrl + '?attachment_id=' + attachmentId;
    if (blob instanceof window.File) {
        uploadUrl += '&filename=' + encodeURIComponent(blob.name);
    }

    return $.ajax(uploadUrl, {
        type: 'POST',
        contentType: 'application/octet-stream',
        beforeSend: function (jqXhr) {
            jqXhr.setRequestHeader('Accept', 'application/js');
        },
        xhr: function () {
            var xhr = $.ajaxSettings.xhr();
            xhr.upload.onloadstart = actualOptions.loadstartEventHandler;
            xhr.upload.onprogress = actualOptions.progressEventHandler;
            return xhr;
        },
        data: blob,
        cache: false,
        processData: false
    });
}

function addInputFiles(inputEl) {
    var clearedFileInput = $(inputEl).clone().val('');

    if (inputEl.files) {
        // upload files using ajax
        uploadAndAttachFiles(inputEl.files, inputEl);
        $(inputEl).remove();
    } else {
        // browser not supporting the file API, upload on form submission
        var attachmentId;
        var aFilename = inputEl.value.split(/\/|\\/);
        attachmentId = addFile(inputEl, { name: aFilename[ aFilename.length - 1 ] }, false);
        if (attachmentId) {
            $(inputEl).attr({ name: 'attachments[' + attachmentId + '][file]', style: 'display:none;' }).appendTo('#attachments_' + attachmentId);
        }
    }

    clearedFileInput.insertAfter('#attachments_fields');
}

function uploadAndAttachFiles(files, inputEl) {

    var maxFileSize = $(inputEl).data('max-file-size');
    var maxFileSizeExceeded = $(inputEl).data('max-file-size-message');

    var sizeExceeded = false;
    $.each(files, function () {
        if (this.size && maxFileSize != null && this.size > parseInt(maxFileSize)) {
            sizeExceeded = true;
        }
    });
    if (sizeExceeded) {
        window.alert(maxFileSizeExceeded);
    } else {
        $.each(files, function () {
            addFile(inputEl, this, true);
        });
    }
}

function handleFileDropEvent(e) {

    $(this).removeClass('fileover');
    blockEventPropagation(e);

    if ($.inArray('Files', e.dataTransfer.types) > -1) {
        uploadAndAttachFiles(e.dataTransfer.files, $('input:file.file_selector'));
    }
}

function dragOverHandler(e) {
    $(this).addClass('fileover');
    blockEventPropagation(e);
}

function dragOutHandler(e) {
    $(this).removeClass('fileover');
    blockEventPropagation(e);
}

function setupFileDrop() {
    if (window.File && window.FileList && window.ProgressEvent && window.FormData) {

        $.event.fixHooks.drop = { props: [ 'dataTransfer' ] };

        $('form div.box').has('input:file').each(function () {
            $(this).on({
                dragover: dragOverHandler,
                dragleave: dragOutHandler,
                drop: handleFileDropEvent
            });
        });
    }
}

$(document).ready(setupFileDrop);
